from pathlib import Path
import sys
import subprocess
import traceback
from typing import Dict, Optional
from .base import BaseTTSEngine


class BaiduTTSEngine(BaseTTSEngine):
    """
    百度AI TTS引擎实现
    """
    
    def __init__(self, config: Optional[Dict] = None):
        super().__init__(config)
        self.has_baidu_tts = False
        self.aip_speech = None
        self.app_id = None
        self.api_key = None
        self.secret_key = None
        self.initialize()
    
    def initialize(self) -> bool:
        """
        初始化百度AI TTS引擎
        """
        print("尝试导入百度AI TTS依赖...")
        
        # 首先安装chardet依赖（百度AI可能需要）
        try:
            import chardet
        except ImportError:
            try:
                print("安装chardet依赖...")
                subprocess.check_call([sys.executable, "-m", "pip", "install", "chardet"])
            except Exception as e:
                print(f"安装chardet依赖时出错: {e}")
        
        # 尝试导入百度AI SDK
        try:
            # 首先尝试直接导入
            try:
                from aip import AipSpeech
                self.aip_speech = AipSpeech
                self.has_baidu_tts = True
                print("✓ 成功导入百度AI TTS依赖 (aip.AipSpeech)")
            except ImportError as e:
                print(f"✗ 导入aip.AipSpeech失败: {e}")
                # 尝试直接安装到当前环境
                try:
                    print("尝试在当前环境安装baidu-aip...")
                    subprocess.check_call([sys.executable, "-m", "pip", "install", "baidu-aip"])
                    # 安装后再次尝试导入
                    from aip import AipSpeech
                    self.aip_speech = AipSpeech
                    self.has_baidu_tts = True
                    print("✓ 安装后成功导入百度AI TTS依赖")
                except Exception as install_error:
                    print(f"✗ 安装baidu-aip失败: {install_error}")
                    return False
            
            # 检查配置
            if self.config:
                self.app_id = self.config.get('app_id')
                self.api_key = self.config.get('api_key')
                self.secret_key = self.config.get('secret_key')
                
                # 验证配置是否有效
                if self.app_id and self.api_key and self.secret_key and self.app_id != "your_app_id":
                    self.initialized = True
                    print("✓ 百度AI TTS引擎初始化成功，配置有效")
                    return True
                else:
                    print("⚠ 百度AI TTS引擎初始化成功，但配置不完整或使用默认值")
                    return True  # 导入成功但配置可能无效
            else:
                print("⚠ 百度AI TTS引擎初始化成功，但未提供配置")
                return True  # 导入成功但配置可能无效
                
        except Exception as e:
            print(f"✗ 百度AI TTS初始化异常: {e}")
            print(f"  异常详情: {traceback.format_exc()}")
            return False
    
    def synthesize(self, text: str, output_path: Path, lang: str = "en") -> bool:
        """
        使用百度AI进行语音合成
        """
        if not self.is_available():
            print(f"  ⚠ 百度AI TTS引擎不可用，无法合成文本: {text}")
            return False
        
        # 检查配置是否有效
        if not (self.app_id and self.api_key and self.secret_key and self.app_id != "your_app_id"):
            print("  ⚠ 百度AI TTS配置无效，请检查app_id、api_key和secret_key")
            return False
        
        try:
            # 初始化百度AI客户端
            client = self.aip_speech(self.app_id, self.api_key, self.secret_key)
            
            # 设置参数
            options = {
                'spd': 5,  # 语速，取值0-9
                'pit': 5,  # 音调，取值0-9
                'vol': 15,  # 音量，取值0-15
                'per': 0   # 发音人，0为女声，1为男声，3为情感合成-度逍遥，4为情感合成-度丫丫
            }
            
            # 根据语言选择不同的模型
            if lang == 'zh':
                # 中文使用默认模型
                result = client.synthesis(text, 'zh', 1, options)
            else:
                # 英文使用英文模型
                result = client.synthesis(text, 'en', 1, options)
            
            # 处理结果
            if not isinstance(result, dict):
                # 写入文件
                with open(output_path, 'wb') as f:
                    f.write(result)
                print(f"  ✓ 生成音节语音: {text} -> {output_path.name} (百度AI)")
                return True
            else:
                print(f"  ⚠ 百度AI TTS失败: {result}")
                return False
                
        except Exception as e:
            print(f"  ⚠ 百度AI TTS异常: {e}")
            return False
    
    def is_available(self) -> bool:
        """
        检查百度AI TTS引擎是否可用
        """
        return self.has_baidu_tts
    
    def get_name(self) -> str:
        """
        获取引擎名称
        """
        return "baidu"